package br.com.biblioteca.Dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.biblioteca.Connect.Conexao;
import br.com.biblioteca.Modelo.Categoria;
import br.com.biblioteca.Modelo.Livro;

public class LivroDao {
	
	private PreparedStatement ps = null;
	private Conexao conexao = new Conexao();

	// inserir livro
	public boolean insertLivro(Livro livro) throws SQLException {
		boolean retorno = false;
		
		try {
			String sql = "insert into tb_livro (nm_livro, nm_autor, ds_livro, id_categoria, tp_status, valor) values (?, ?, ?, ?, ?, ?);";
			ps = conexao.getConnection().prepareStatement(sql);
			ps.setString(1, livro.getNmLivro());
			ps.setString(2, livro.getNmAutor());
			ps.setString(3, livro.getDsLivro());
			ps.setInt(4, livro.getCategoria().getId());
			ps.setInt(5, livro.getStatus());
			ps.setFloat(6, livro.getValor());

			int insert = ps.executeUpdate();
			
			if (insert != 0) {
				retorno = true;
			} else {
				retorno = false;
			}
			
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}
		
		
		return retorno;
	}

	// atualizar livro
	public boolean updateLivro(Livro livro) throws SQLException {
		boolean retorno = false;
		
		try {
			String sql = "update tb_livro set nm_livro = ?, nm_autor = ?, ds_livro = ?, id_categoria = ?, tp_status = ?, valor = ? where id = ?;";
			ps = conexao.getConnection().prepareStatement(sql);
			ps.setString(1, livro.getNmLivro());
			ps.setString(2, livro.getNmAutor());
			ps.setString(3, livro.getDsLivro());
			ps.setInt(4, livro.getCategoria().getId());
			ps.setInt(5, livro.getStatus());
			ps.setFloat(6, livro.getValor());
			ps.setInt(7, livro.getId());

			int update = ps.executeUpdate();
			
			if (update != 0) {
				retorno = true;
			} else {
				retorno = false;
			}
			
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}
		
		return retorno;
	}

	// deletar livro
	public boolean deleteLivro(Livro livro) throws SQLException {
		boolean retorno = false;
		
		try {
			String sql = "delete from tb_livro where id = ?;";
			ps = conexao.getConnection().prepareStatement(sql);
			ps.setInt(1, livro.getId());
			
			int delete = ps.executeUpdate();
			
			if (delete != 0) {
				retorno = true;
			} else {
				retorno = false;
			}
			
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}
		
		
		return retorno;
	}

	// Listar ALL livros ou busca filtrada
	public List<Livro> listLivro(Livro livro) throws SQLException {
		List<Livro> listLivro = null;
		
		try {
			String sql = null;

			if (livro != null) {
				sql = "select * from tb_livro where";
				boolean or = false;
				
				if (livro.getNmLivro() != null && livro.getNmLivro().trim().length() > 0) {
					sql += " nm_livro like + '%" +livro.getNmLivro()+ "%'";
					or = true;
				}

				else if (livro.getNmAutor() != null && livro.getNmAutor().trim().length() > 0) {
					if (or) {
						sql += " or nm_autor like + '%" +livro.getNmAutor()+ "%'";
					} else {
						sql += " nm_autor like + '%" +livro.getNmAutor()+ "%'";
					}
				}

				else  if (livro.getDsLivro() != null && livro.getDsLivro().trim().length() > 0) {
					if (or) {
						sql += " or ds_livro like + '%" +livro.getDsLivro()+ "%'";
					} else {
						sql += " ds_livro like + '%" +livro.getDsLivro()+ "%'";
					}
				}

				else  if (livro.getCategoria() != null && livro.getCategoria().getId() > 0) {
					if (or) {
						sql += " or id_categoria = " + livro.getCategoria().getId();
					} else {
						sql += " id_categoria = " + livro.getCategoria().getId();
					}
				}
				
				sql += " order by nm_livro;";
				
			} else {
				sql = "select * from tb_livro order by nm_livro;";
			}
			
			PreparedStatement ps = conexao.getConnection().prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery(); 
			
			if (!rs.equals(null)) {
				listLivro = new ArrayList<Livro>();
			}
			
			listLivro = new ArrayList<Livro>();
			Livro livroAux = null;
			
			while (rs.next()) {
				livroAux = new Livro();
				livroAux.setId(rs.getInt("id"));
				livroAux.setNmLivro(rs.getString("nm_livro"));
				livroAux.setNmAutor(rs.getString("nm_autor"));
				livroAux.setDsLivro(rs.getString("ds_livro"));
				livroAux.setStatus(rs.getInt("tp_status"));
				livroAux.setValor(rs.getFloat("valor"));
				livroAux.setCategoria(getCategoria(rs.getInt("id_categoria")));
				listLivro.add(livroAux);
			}
			
			rs.close();
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}
		
		return listLivro;
	}
	
	// Buscar uma Categoria.
	public Categoria getCategoria(int id) throws SQLException {
		Categoria categoria = null;
		Conexao conexaoAux = new Conexao();
		
		try {
			String sql = "select * from tb_categoria where id = ?;";

			ps = conexaoAux.getConnection().prepareStatement(sql);
			ps.setInt(1, id);
			
			ResultSet rs = ps.executeQuery();
			
			if (rs.next()) {
				categoria = new Categoria();
				categoria.setId(rs.getInt("id"));
				categoria.setDsCategoria(rs.getString("ds_categoria"));
			}
			
			rs.close();
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexaoAux.closeConnection();
		}
		
		return categoria;
	}
	
	// Listar ALL Categorias
	public List<Categoria> listCategoria() throws SQLException {
		List<Categoria> listCategoria = null;
		
		try {
			String sql = "select * from tb_categoria;";
			ps = conexao.getConnection().prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery();
			
			Categoria categoria = null;
			
			if (!rs.equals(null)) {
				listCategoria = new ArrayList<Categoria>();
			}
			
			while (rs.next()) {
				categoria = new Categoria();
				categoria.setId(rs.getInt("id"));
				categoria.setDsCategoria(rs.getString("ds_categoria"));
				
				listCategoria.add(categoria);
			}
			
			rs.close();
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}
		
		return listCategoria;
	}
	
}